package gcp.gui;

import gcp.Amigo;
import gcp.Colecionavel;
import gcp.Emprestimo;
import gcp.Filme;
import gcp.Gibi;
import gcp.Jogo;
import gcp.Pessoa;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.text.MaskFormatter;

/**
 * FramePegarEmprestado<br>
 * Frame responsavel criar emprestimos no qual o usuario pega um item do amigo.
 * @author Catharine Quintans.
 */
public class FramePegarEmprestado extends JInternalFrame {

    private static final long serialVersionUID = 1L;

    private FrameGCP frameGcp;
    private GCP gcp;
    private Container tela;

    private JLabel textoTitulo, textoProprietario, textoDataEmprestimo,
            textoTipoDoItem, textoComentarios;
    private JTextField campoDataDeEmprestimo, campoTitulo;
    private JTextArea campoComentarios;
    private JComboBox comboProprietario, comboTipoDoItem;
    private JScrollPane barraDeRolagem;
    private JButton botaoOk, botaoSair, botaoLimpar;
    private Emprestimo emprestimo;

    /**
     * Contrutor para FrameEmprestimo.
     * @param frameGcp Frame principal do GCP.
     * @param emprestimo Emprestimo a ser editado, ou null para criacao de um
     *            novo.
     */
    public FramePegarEmprestado(FrameGCP frameGcp, Emprestimo emprestimo) {
        super("Pegar Emprestado");
        this.frameGcp = frameGcp;
        this.emprestimo = emprestimo;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Inicializa os componentes.
     */
    private void inicializar() {
        setSize(600, 500);
        setClosable(true);
        tela = getContentPane();
        tela.setLayout(null);

        textoDataEmprestimo = new JLabel("Data do emprestimo: ");
        textoComentarios = new JLabel("Comentários adicionais: ");
        textoProprietario = new JLabel("Proprietário: ");
        textoTipoDoItem = new JLabel("Tipo do item: ");
        textoTitulo = new JLabel("Título: ");

        campoComentarios = new JTextArea(200, 700);
        campoComentarios.setLineWrap(true);
        campoComentarios.setWrapStyleWord(true);

        barraDeRolagem = new JScrollPane(campoComentarios);
        barraDeRolagem
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        botaoOk = new JButton("Ok");
        botaoLimpar = new JButton("Limpar");
        botaoSair = new JButton("sair");

        comboProprietario = new JComboBox();

        comboTipoDoItem = new JComboBox();
        comboTipoDoItem.addItem("Selecione");
        comboTipoDoItem.addItem("Gibi");
        comboTipoDoItem.addItem("Filme");
        comboTipoDoItem.addItem("Jogo");

        campoDataDeEmprestimo = criarCampoData();
        campoTitulo = new JTextField();

        List<Amigo> amigos = gcp.getListAmigo(frameGcp.getUsuarioLogado());
        if (amigos != null) {
            for (Amigo amigo : amigos) {
                comboProprietario.addItem(amigo);
            }
        }

        campoDataDeEmprestimo.setText(new SimpleDateFormat("dd/MM/yyyy")
                .format(new Date()));
    }

    /**
     * Cria um campo com a mascara para manipulacao de datas no FrameEmprestimo.
     */
    private JTextField criarCampoData() {
        try {
            MaskFormatter mascaraData = new MaskFormatter("**/**/****");
            mascaraData.setPlaceholderCharacter('_');
            mascaraData.setValidCharacters("0123456789 _");
            JFormattedTextField retorno = new JFormattedTextField(mascaraData);
            return retorno;
        } catch (ParseException e) {
            JFormattedTextField retorno = new JFormattedTextField();
            return retorno;
        }
    }

    /**
     * Define a posicao dos componentes em tela.
     */
    private void posicoes() {

        textoDataEmprestimo.setBounds(0, 10, 120, 27);
        campoDataDeEmprestimo.setBounds(120, 10, 80, 27);

        textoProprietario.setBounds(200, 10, 80, 27);
        comboProprietario.setBounds(280, 10, 300, 27);

        textoTipoDoItem.setBounds(0, 40, 120, 27);
        comboTipoDoItem.setBounds(120, 40, 100, 27);

        textoTitulo.setBounds(0, 70, 120, 27);
        campoTitulo.setBounds(120, 70, 460, 27);

        textoComentarios.setBounds(10, 100, 200, 27);
        barraDeRolagem.setBounds(10, 130, 570, 150);

        botaoOk.setBounds(440, 300, 100, 27);
        botaoLimpar.setBounds(440, 340, 100, 27);
        botaoSair.setBounds(440, 380, 100, 27);

        textoDataEmprestimo.setHorizontalAlignment(SwingConstants.RIGHT);
        textoProprietario.setHorizontalAlignment(SwingConstants.RIGHT);
        textoTipoDoItem.setHorizontalAlignment(SwingConstants.RIGHT);
        textoTitulo.setHorizontalAlignment(SwingConstants.RIGHT);
    }

    /**
     * Define as acoes dos objetos.
     */
    private void acoes() {
        // Ao apertar o botao ok confirmar o cadastro do Emprestimo
        botaoOk.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                cadastrar();
            }
        });
        // Ao apertar o botao limpar limpa os campos preenchidos
        botaoLimpar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                campoDataDeEmprestimo.setText(null);
                campoDataDeEmprestimo.setText(null);
                campoComentarios.setText(null);
            }
        });
        // fecha a janela ao apertar o botao sair
        botaoSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }

    /**
     * Carrega os dados do Emprestimo em tela.
     */
    private void carregar() {
        if (emprestimo != null) {
            comboProprietario.setSelectedItem(emprestimo.getProprietario());
            campoComentarios.setText(emprestimo.getComentarios());
            campoDataDeEmprestimo.setText(new SimpleDateFormat("dd/MM/yyyy")
                    .format(emprestimo.getDataDeEmprestimo()));
        }
    }

    /**
     * Cria um Emprestimo e Adiciona as informacoes obtidas ao cadastro do
     * Emprestimo.
     **/
    @SuppressWarnings("deprecation")
    protected void cadastrar() {
        boolean novo = emprestimo == null;
        String dataDeEmprestimo = campoDataDeEmprestimo.getText();
        String comentarios = campoComentarios.getText();

        Date date = null;
        try {
            date = new SimpleDateFormat("dd/MM/yyyy").parse(dataDeEmprestimo);
            if (date.getDay() <= 0 || date.getDay() > 31 || date.getMonth() < 0
                    || date.getMonth() > 11 || date.getYear() + 1900 < 1900
                    || date.getYear() + 1900 > 2100) {
                frameGcp.exibirMensagem("A data de empréstimo não é válida.");
                return;
            }
        } catch (ParseException e) {
            frameGcp.exibirMensagem("A data de empréstimo não é válida.");
            return;
        }
        if (novo)
            emprestimo = new Emprestimo();
        emprestimo.setDataDeEmprestimo(date);

        try {
            emprestimo.setEmprestadoA(frameGcp.getUsuarioLogado());
            emprestimo.setProprietario((Pessoa) comboProprietario
                    .getSelectedItem());

            Colecionavel item = null;
            if (comboTipoDoItem.getSelectedItem().equals("Gibi")) {
                item = new Gibi();
            } else if (comboTipoDoItem.getSelectedItem().equals("Filme")) {
                item = new Filme();
            } else if (comboTipoDoItem.getSelectedItem().equals("Jogo")) {
                item = new Jogo();
            } else {
                frameGcp.exibirMensagem("Tipo do item desconhecido.");
                return;
            }
            item.setTitulo(campoTitulo.getText());
            emprestimo.setItem(item);
            emprestimo.setComentarios(comentarios);

            if (novo)
                gcp.adicionaEmprestimo(emprestimo);
            dispose();
        } catch (Exception e) {
            e.printStackTrace();
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona os componentes em tela.
     */
    private void constroiTela() {
        tela.add(textoComentarios);
        tela.add(textoDataEmprestimo);
        tela.add(textoProprietario);
        tela.add(textoTipoDoItem);
        tela.add(textoTitulo);

        tela.add(campoDataDeEmprestimo);
        tela.add(campoTitulo);

        tela.add(botaoOk);
        tela.add(botaoLimpar);
        tela.add(botaoSair);

        tela.add(comboProprietario);
        tela.add(comboTipoDoItem);

        tela.add(barraDeRolagem);
    }
}